﻿//#include<iostream>
//using namespace std;
//
//int& getRef(int& a) { return a; }
//
//int main() {
//    int x = 10;
//    int y = 5;
//    int arr[3] = { 1, 2, 3 };
//    int* p = &y;
//
//    // 常见左值
//    x = 20;           // 具名变量
//    *p = 42;          // 解引用表达式
//    arr[0] = 10;      // 数组元素
//    getRef(x) = 200;  // 返回引用的函数
//    char str[] = "hello";
//    str[0] = 'H';     // 字符数组元素
//
//    //常见右值
//    int a = 1 + 2;    // 算术运算的结果（1+2 是右值）
//    int b = x + y;    // 表达式结果
//    int c = 100;      // 字面量 100 是右值
//    int d = x++;      // x++ 产生右值
//    int e = std::move(x); // std::move(x) 是右值
//
//    return 0;
//}


#include<iostream>
using namespace std;
void f(int& x)
{
	std::cout << "左值引⽤重载 f(" << x << ")\n";
} 
void f(const int& x)
{
	std::cout << "到 const 的左值引⽤重载 f(" << x << ")\n";
} 
void f(int&& x)
{
	std::cout << "右值引⽤重载 f(" << x << ")\n";
} 
int main()
{
	int i = 1;
	const int ci = 2;
	f(i); // 调⽤ f(int&)
	f(ci); // 调⽤ f(const int&)
	f(3); // 调⽤ f(int&&)，如果没有 f(int&&) 重载则会调⽤ f(const int&)
	f(std::move(i)); // 调⽤ f(int&&)
	// 右值引⽤变量在⽤于表达式时是左值
	int && x = 1;
	f(x); // 调⽤ f(int& x)
	f(std::move(x)); // 调⽤ f(int&& x)
	return 0;
}